package com.baidu.disconf.web.web.auth.login.impl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisKeyValueTemplate;

import com.baidu.disconf.web.service.user.bo.User;
import com.baidu.disconf.web.service.user.constant.UserConstant;
import com.baidu.disconf.web.service.user.dto.Visitor;
import com.baidu.disconf.web.web.auth.constant.LoginConstant;
import com.baidu.disconf.web.web.auth.login.RedisLogin;
import com.baidu.ub.common.commons.ThreadContext;
import com.github.knightliao.apollo.utils.web.CookieUtils;

/**
 * @author liaoqiqi
 * @version 2014-2-4
 */
public class RedisLoginImpl implements RedisLogin {
	// @Autowired(required = false)
	// private RedisCacheManager redisCacheMgr;

	@Autowired
	private RedisKeyValueTemplate redisKeyValueTemplate;

	/**
	 * 获取Redis上的User Key
	 *
	 * @param baiduId
	 *
	 * @return
	 */
	private String getRedisKey(String baiduId) {
		return baiduId + UserConstant.USER_KEY;
	}

	/**
	 * 校验Redis是否登录
	 */
	@Override
	public Visitor isLogin(HttpServletRequest request) {

		String xId = CookieUtils.getCookieValue(request, LoginConstant.XONE_COOKIE_NAME_STRING);

		if (xId != null) {

			// Visitor visitor = (Visitor)
			// redisCacheMgr.get(this.getRedisKey(xId));
			// Visitor visitor = (Visitor)
			// request.getSession().getAttribute(this.getRedisKey(xId));
			Visitor visitor = redisKeyValueTemplate.findById(this.getRedisKey(xId), Visitor.class);

			//
			// 登录了
			//
			if (visitor != null) {

				return visitor;

			} else {

				return null;
			}

		} else {

			return null;
		}
	}

	/**
	 * 登录
	 */
	@Override
	public void login(HttpServletRequest request, User user, int expireTime) {

		Visitor visitor = new Visitor();

		//
		//
		//
		visitor.setId(user.getId());
		visitor.setLoginUserId(user.getId());
		visitor.setLoginUserName(user.getName());
		visitor.setRoleId(user.getRoleId());
		visitor.setAppIds(user.getOwnApps());

		//
		// 更新session
		//
		updateSessionVisitor(request.getSession(), visitor);

		//
		// 更新Redis数据
		//
		updateRedisVisitor(visitor, request, expireTime);
	}

	/**
	 * @param visitor
	 */
	private void updateRedisVisitor(Visitor visitor, HttpServletRequest request, int expireTime) {

		String xcookieName = CookieUtils.getCookieValue(request, LoginConstant.XONE_COOKIE_NAME_STRING);

		// 更新Redis数据
		if (xcookieName != null) {

			// 更新
			if (visitor != null) {

				// redisCacheMgr.put(this.getRedisKey(xcookieName), expireTime,
				// visitor);
				// request.getSession().setAttribute(this.getRedisKey(xcookieName),
				// visitor);

				redisKeyValueTemplate.insert(this.getRedisKey(xcookieName), visitor);
			} else {

				// 删除
				// redisCacheMgr.remove(this.getRedisKey(xcookieName));
				// request.getSession().removeAttribute(this.getRedisKey(xcookieName));
				redisKeyValueTemplate.delete(this.getRedisKey(xcookieName));
			}
		}
	}

	/**
	 * 更新Session中的Userid
	 *
	 * @param session
	 * @param visitor
	 */
	public void updateSessionVisitor(HttpSession session, Visitor visitor) {

		if (visitor != null) {
			// 更新
			session.setAttribute(UserConstant.USER_KEY, visitor);
		} else {

			// 删除
			session.removeAttribute(UserConstant.USER_KEY);
		}

		ThreadContext.putSessionVisitor(visitor);
	}

	/**
	 * 登出
	 */
	@Override
	public void logout(HttpServletRequest request) {

		// 更新session
		updateSessionVisitor(request.getSession(), null);

		// 更新redis
		updateRedisVisitor(null, request, 0);
	}

}
